package view;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.KeyStroke;

import common.Contexto;
import controller.ConjuntoController;
import controller.MainController;
import controller.MaterialController;
import controller.PrendaController;


@SuppressWarnings("serial")
public class MainPanel extends JPanel {
	private JMenuBar menuBar;
	private JMenu archivo;
	private JMenuItem altaPrenda, altaConjunto, altaMaterial, nuevaVenta, generarOC;
	private JLabel codigoL, criterioL;
	private JTextField codigoT;
	private JButton buscarB, verTodosB;
	private JRadioButton materialR, conjuntoR, prendaR;
	private ButtonGroup group;
	
	public MainPanel() {
		initGui();
		layoutComponents();
		initActions();
	}
	
	private void initGui() {		
		criterioL = new JLabel("Por favor seleccione el elemento a buscar");
		codigoL = new JLabel("Codigo:");
		codigoT = new JTextField(12);
		buscarB = new JButton("Buscar");
		verTodosB = new JButton("Ver todos");
		
		prendaR = new JRadioButton("Prenda");
		prendaR.setSelected(true);
		conjuntoR = new JRadioButton("Conjunto");
		materialR = new JRadioButton("Material");
		group = new ButtonGroup();
		group.add(prendaR);
		group.add(conjuntoR);
		group.add(materialR);
		
		menuBar = new JMenuBar();
		archivo = new JMenu("Archivo");
		archivo.setMnemonic(KeyEvent.VK_A);
		altaPrenda = new JMenuItem("Nueva Prenda", new ImageIcon("images/new.png"));
		altaPrenda.setAccelerator(KeyStroke.getKeyStroke(
		        KeyEvent.VK_P, ActionEvent.ALT_MASK));
		altaConjunto = new JMenuItem("Nuevo Conjunto", new ImageIcon("images/new.png"));
		altaConjunto.setAccelerator(KeyStroke.getKeyStroke(
		        KeyEvent.VK_C, ActionEvent.ALT_MASK));
		altaMaterial = new JMenuItem("Nuevo Material", new ImageIcon("images/new.png"));
		altaMaterial.setAccelerator(KeyStroke.getKeyStroke(
		        KeyEvent.VK_M, ActionEvent.ALT_MASK));
		nuevaVenta = new JMenuItem("Nueva Venta", new ImageIcon("images/new.png"));
		nuevaVenta.setAccelerator(KeyStroke.getKeyStroke(
		        KeyEvent.VK_V, ActionEvent.ALT_MASK));
		
		generarOC = new JMenuItem("Nueva Orden de Compra", new ImageIcon("images/new.png"));
		generarOC.setAccelerator(KeyStroke.getKeyStroke(
		        KeyEvent.VK_O, ActionEvent.ALT_MASK));
		
		menuBar.add(archivo);        
        archivo.add(altaPrenda);
        archivo.add(altaConjunto);
        archivo.add(altaMaterial);
        archivo.add(nuevaVenta);
        archivo.add(generarOC);
	}

	private void layoutComponents() {
		this.setLayout(new BorderLayout());
		
		add(menuBar, BorderLayout.PAGE_START);
		
		JPanel searchPanel = new JPanel(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
		c.gridx = 0;
		c.gridy = 0;
		c.gridwidth = 2;
		c.insets = new Insets(0, 5, 0, 0);
		searchPanel.add(criterioL, c);
		
		c.gridwidth = 1;
		c.insets = new Insets(10, 25, 0, 0);
		c.gridy = GridBagConstraints.RELATIVE;
		c.fill = GridBagConstraints.HORIZONTAL;
		searchPanel.add(prendaR, c);
		searchPanel.add(conjuntoR, c);
		searchPanel.add(materialR, c);
		c.ipady = 15;
		c.insets = new Insets(10, 0, 0, 0);
		c.fill = GridBagConstraints.NONE;
		searchPanel.add(codigoL, c);
		
		c.gridx = 1;
		c.gridy = 4;
		c.ipady = 0;
		c.anchor = GridBagConstraints.WEST;
		c.fill = GridBagConstraints.BOTH;
		c.ipadx = 30;
		searchPanel.add(codigoT, c);
		
		c.gridy = 5;
		c.ipadx = 0;
		c.fill = GridBagConstraints.NONE;
		searchPanel.add(buscarB, c);
		
		c.gridy = 5;
		c.insets = new Insets(10, 80, 0, 0);
		c.gridx = 1;
		c.fill = GridBagConstraints.NONE;
		searchPanel.add(verTodosB, c);
	
		add(searchPanel, BorderLayout.WEST);
	}
	
	private void initActions() {
		altaPrenda.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				PrendaController.getInstance().altaPrendaPanel();
			}
		});
		
		buscarB.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				if(validateFields()) {
					String codigo = codigoT.getText();
					if (prendaR.isSelected()) {
						boolean encontroPrenda = PrendaController.getInstance().mostrarPrenda(codigo);
						if(!encontroPrenda) {
							notificarError("No se encontro la prenda con codigo "+codigo);
						}
					} else if (conjuntoR.isSelected()) {
						boolean encontroConjunto = ConjuntoController.getInstance().mostrarConjunto(codigo);
						if(!encontroConjunto) {
							notificarError("No se encontro el conjunto con codigo "+codigo);
						}
						
					} else {
						boolean encontroMaterial = MaterialController.getInstance().mostrarMaterial(codigo);
						if(!encontroMaterial) {
							notificarError("No se encontro el material con codigo "+codigo);
						}
					}
				}
			}
		});
		
		verTodosB.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				if (prendaR.isSelected()) {
					PrendaController.getInstance().mostrarPrendas();
				} else if (conjuntoR.isSelected()) {
					ConjuntoController.getInstance().mostrarConjuntos();
				} else {
					MaterialController.getInstance().mostrarMateriales();
				}
			}
		});
		
		altaConjunto.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				ConjuntoController.getInstance().altaConjuntoPanel();
			}			
		});
		
		altaMaterial.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				MaterialController.getInstance().altaMaterialPanel();
			}			
		});
		
		nuevaVenta.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				MainController.getInstance().altaFacturaPanel();
			}			
		});
		
		generarOC.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				int generoOC = MainController.getInstance().generarOrdenesDeCompra();
				if (generoOC == MainController.ORDEN_GENERADA) {
					notificarMensaje("La orden de compra se genero con exito");
				}else if(generoOC == MainController.ORDEN_NO_GENERADA) {
					notificarError("No hay materiales debajo del punto de pedido");
				}else {
					notificarError("Oops! No pudo generarse la orden de compra");
				}
			}
		});
	}
	
	private boolean validateFields() {
		boolean result = true;
		String codigo = codigoT.getText();
		if(codigo.length() == 0) {
			result = false;
			notificarError("Debe ingresar un codigo para realizar la busqueda");
		}
		return result;
	}
	
	private void notificarError(String error) {
		Contexto.displayErrorMessage(MainPanel.this,error);
	}
	
	private void notificarMensaje(String mensaje) {
		Contexto.displayFeedbackMessage(MainPanel.this, mensaje);
	}
	
	public void showPanel() {
		final JFrame mainFrame = new JFrame();
        mainFrame.setTitle("AI TP0");
        mainFrame.getContentPane().add(this);
        mainFrame.setPreferredSize(new Dimension(510,260));
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.pack();
        mainFrame.setLocationRelativeTo(null);
        mainFrame.setVisible(true);
	}
}
